--[[
 * =============================================================================
 * 脚本名称: dailyMission.lua
 * 脚本作用: 每日任务自动化脚本
 *
 * 主要功能:
 * 1. 自动完成游戏中的每日任务流程
 * 2. 自动领取已完成任务的奖励
 * 3. 自动设置每日任务的一键接受
 * 4. 支持多个地区和副本的任务管理
 * 5. 智能识别界面元素和按钮状态
 *
 * 核心流程:
 * 1. 进入每日任务界面（菜单 -> 任务 -> 每日任务）
 * 2. 设置任务参数（连续进行、包括日程安排）
 * 3. 自动领取所有已完成任务的奖励
 * 4. 一键设置所有区域和副本的任务接受
 * 5. 保存设置并返回主界面
 *
 * 支持地区:
 * - 巴斯提姆：讨伐石崖路口、科利亚山脉、衰败空地等8个区域
 * - 切拉姆、阿维利乌斯、特罗内特、卡代尔等地区
 * - 副本：修炼之林区域讨伐
 *
 * 技术特性:
 * - 使用TURING文字识别技术
 * - 智能坐标定位和按钮识别
 * - 滚动查找和自动点击
 * - 严格的配置验证和错误处理
 * - 模块化设计，易于维护
 * - 动态配置加载，支持实时更新
 *
 * 使用方法:
 * 调用 M.StartDailyMission() 开始执行每日任务
 * 调用 M.Test() 进行功能测试
 *
 * 作者: 游戏自动化系统
 * 创建时间: 2024年
 * 版本: 1.0
 * =============================================================================
--]]

-- dailyMission.lua 每日任务功能
-- 实现每日任务的自动化操作

local Tools = require("Tools")
local text_recognition_lib = require('Config/TextRecognition2').文字识别库_每日任务
local text_recognition_lib_level = require('Config/TextRecognition2').文字识别库_每日任务_等级数字库
local config = require('Config/config')  -- 加载配置文件
local config_loader = require('Config/config_loader')  -- 加载配置加载器

-- 通过config_loader加载真实配置数据，替代硬编码的模拟数据
-- 配置在主函数开始时检查一次，其他地方直接使用已加载的配置
local gameConfig = nil

-- 初始化游戏配置
local function init_game_config()
    if not gameConfig then
        print("[DEBUG] 开始加载游戏配置...")
        
                -- 尝试加载每日任务配置
        local daily_mission_config = config_loader.load_daily_mission_config()
        if daily_mission_config then
            print("[DEBUG] 每日任务配置加载成功")
            print("[DEBUG] ========== 完整配置内容开始 ==========")
            print("[DEBUG] 配置数据类型: " .. type(daily_mission_config))
            
            -- 递归打印配置内容
            local function print_table(t, indent)
                indent = indent or ""
                for key, value in pairs(t) do
                    if type(value) == "table" then
                        print(indent .. tostring(key) .. " = {")
                        print_table(value, indent .. "  ")
                        print(indent .. "}")
                    else
                        print(indent .. tostring(key) .. " = " .. tostring(value))
                    end
                end
            end
            
            print_table(daily_mission_config)
            print("[DEBUG] ========== 完整配置内容结束 ==========")
            
            -- 验证配置结构并转换为内部格式
            if daily_mission_config.dungeons and daily_mission_config.regions then
                print("[DEBUG] 配置结构验证成功：包含dungeons和regions")
                
                -- 转换为内部使用的格式，并重构为包含count的格式
                gameConfig = {
                    ["副本"] = {},
                    ["区域"] = {}
                }
                
                -- 重构副本配置，合并重复等级
                if daily_mission_config.dungeons then
                    for _, dungeon in ipairs(daily_mission_config.dungeons) do
                        local newDungeon = {
                            name = dungeon.name,
                            areas = {}
                        }
                        
                        -- 统计每个等级的数量
                        local levelCounts = {}
                        for _, area in ipairs(dungeon.areas) do
                            if area.level then
                                levelCounts[area.level] = (levelCounts[area.level] or 0) + 1
                            end
                        end
                        
                        -- 转换为count格式
                        for level, count in pairs(levelCounts) do
                            table.insert(newDungeon.areas, {
                                level = level,
                                count = count
                            })
                        end
                        
                        table.insert(gameConfig["副本"], newDungeon)
                    end
                end
                
                -- 重构区域配置，合并重复等级
                if daily_mission_config.regions then
                    for _, region in ipairs(daily_mission_config.regions) do
                        local newRegion = {
                            name = region.name,
                            areas = {}
                        }
                        
                        -- 统计每个等级的数量
                        local levelCounts = {}
                        for _, area in ipairs(region.areas) do
                            if area.level then
                                levelCounts[area.level] = (levelCounts[area.level] or 0) + 1
                            end
                        end
                        
                        -- 转换为count格式
                        for level, count in pairs(levelCounts) do
                            table.insert(newRegion.areas, {
                                level = level,
                                count = count
                            })
                        end
                        
                        table.insert(gameConfig["区域"], newRegion)
                    end
                end
                
                print("[DEBUG] 配置重构完成（合并重复等级为count格式）")
                print("[DEBUG] 副本数量: " .. #gameConfig["副本"])
                print("[DEBUG] 区域数量: " .. #gameConfig["区域"])
                
                -- 显示重构后的配置详情
                print("[DEBUG] ========== 重构后配置详情 ==========")
                for i, region in ipairs(gameConfig["区域"]) do
                    if region.name and region.areas then
                        print("[DEBUG]   区域" .. i .. ": " .. region.name .. " (子区域数量: " .. #region.areas .. ")")
                        for j, area in ipairs(region.areas) do
                            if area.level and area.count then
                                print("[DEBUG]     区域" .. j .. ": " .. area.level .. " (数量: " .. area.count .. ")")
                            end
                        end
                    end
                end
                print("[DEBUG] ========== 重构后配置详情结束 ==========")
                
                -- 验证副本配置
                if #gameConfig["副本"] > 0 then
                    print("[DEBUG] 副本配置详情:")
                    for i, dungeon in ipairs(gameConfig["副本"]) do
                        if dungeon.name and dungeon.areas then
                            print("[DEBUG]   副本" .. i .. ": " .. dungeon.name .. " (区域数量: " .. #dungeon.areas .. ")")
                            -- 显示具体区域的等级信息
                            if #dungeon.areas > 0 then
                                for j, area in ipairs(dungeon.areas) do
                                    if area.level then
                                        print("[DEBUG]     区域" .. j .. ": " .. area.level)
                                    end
                                end
                            end
                        end
                    end
                end
                
                -- 验证区域配置
                if #gameConfig["区域"] > 0 then
                    print("[DEBUG] 区域配置详情:")
                    for i, region in ipairs(gameConfig["区域"]) do
                        if region.name and region.areas then
                            print("[DEBUG]   区域" .. i .. ": " .. region.name .. " (子区域数量: " .. #region.areas .. ")")
                            -- 显示具体区域的等级信息
                            if #region.areas > 0 then
                                for j, area in ipairs(region.areas) do
                                    if area.level then
                                        print("[DEBUG]     区域" .. j .. ": " .. area.level)
                                    end
                                end
                            end
                        end
                    end
                end
                
            else
                print("[ERROR] 配置结构验证失败：缺少dungeons或regions字段")
                print("[ERROR] 当前配置键: " .. table.concat(get_table_keys(daily_mission_config), ", "))
                gameConfig = nil
                return nil
            end
        else
            print("[WARNING] 每日任务配置加载失败，尝试加载挂机配置...")
            
            -- 如果每日任务配置失败，尝试加载挂机配置
            local hang_config = config_loader.load_hang_config()
            if hang_config then
                print("[DEBUG] 挂机配置加载成功，转换为游戏配置格式")
                print("[DEBUG] ========== 挂机配置内容开始 ==========")
                print("[DEBUG] 配置数据类型: " .. type(hang_config))
                
                -- 递归打印配置内容
                local function print_table(t, indent)
                    indent = indent or ""
                    for key, value in pairs(t) do
                        if type(value) == "table" then
                            print(indent .. tostring(key) .. " = {")
                            print_table(value, indent .. "  ")
                            print(indent .. "}")
                        else
                            print(indent .. tostring(key) .. " = " .. tostring(value))
                        end
                    end
                end
                
                print_table(hang_config)
                print("[DEBUG] ========== 挂机配置内容结束 ==========")
                
                -- 将挂机配置转换为游戏配置格式
                gameConfig = {
                    ["区域"] = hang_config.regions or {},
                    ["副本"] = hang_config.instances or {}
                }
            else
                print("[ERROR] 所有配置加载失败！")
                print("[ERROR] 请检查以下问题：")
                print("[ERROR] 1. 配置文件是否存在且格式正确")
                print("[ERROR] 2. 配置文件路径是否正确")
                print("[ERROR] 3. 配置文件权限是否正确")
                gameConfig = nil
                return nil
            end
        end
        
        -- 验证配置结构
        if gameConfig and type(gameConfig) == "table" then
            print("[DEBUG] 配置数据类型: " .. type(gameConfig))
            
            if gameConfig["区域"] then
                print("[DEBUG] 区域数量: " .. #gameConfig["区域"])
            end
            if gameConfig["副本"] then
                print("[DEBUG] 副本数量: " .. #gameConfig["副本"])
            end
            
            -- 验证配置内容是否有效
            if not gameConfig["区域"] or #gameConfig["区域"] == 0 then
                print("[ERROR] 配置中缺少区域信息或区域列表为空")
                gameConfig = nil
                return nil
            end
            
            if not gameConfig["副本"] or #gameConfig["副本"] == 0 then
                print("[WARNING] 配置中缺少副本信息或副本列表为空")
            end
        else
            print("[ERROR] 配置数据类型错误，期望table，实际: " .. type(gameConfig))
            gameConfig = nil
            return nil
        end
    end
    return gameConfig
end

-- 辅助函数：获取表的键列表
local function get_table_keys(t)
    local keys = {}
    for key, _ in pairs(t) do
        table.insert(keys, tostring(key))
    end
    return keys
end



-- 1. 点击菜单按钮
local function ClickMenuBtn()
    return Tools.click_button("菜单按钮", "主界面菜单", "1", 
        1216,30,1262,49,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-90",               -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        20,2,                 -- 切割参数（来自TURING.切割范围投影切割）
        text_recognition_lib  -- 字库函数
    )
end

-- 2. 点击任务按钮
local function ClickTaskBtn()
    print("2-开始检测并点击任务按钮")
    
    -- 使用while循环持续检测，直到找到任务按钮并成功点击为止
    local maxAttempts = 30  -- 最大尝试次数，防止无限循环（30秒）
    local attemptCount = 0
    
    while attemptCount < maxAttempts do
        attemptCount = attemptCount + 1
        print("第 " .. attemptCount .. " 次尝试检测任务按钮")
        
        -- 尝试点击任务按钮
        local success = Tools.click_button("任务", "任务", "2",
            978, 218, 1009, 234,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
            "0-94",               -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
            1, 6,                 -- 切割参数（来自TURING.切割_范围投影切割）
            text_recognition_lib  -- 字库函数
        )
        
        if success then
            print("成功点击任务按钮，在第 " .. attemptCount .. " 次尝试时成功")
            return true
        else
            print("第 " .. attemptCount .. " 次尝试未找到任务按钮，等待1秒后继续...")
            sleep(1000)  -- 等待1秒后继续尝试
        end
    end
    
    print("达到最大尝试次数 " .. maxAttempts .. "，检测任务按钮失败")
    return false
end

-- 3. 点击每日任务按钮
local function ClickDailyTaskBtn()
    return Tools.click_button("每日", "每日任务", "3",
        608, 86, 654, 115,    -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-46",               -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                 -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib  -- 字库函数
    )
end

-- 5. 检测并点击连续进行右边的按钮
local function ClickContinuousButton()
    print("5-检测并点击连续进行右边的按钮")
    local flag = Tools.turing_recognize_and_act(
        675, 648, 815, 688,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-119",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割范围投影切割）
        text_recognition_lib, 
        "使用",              -- 目标文字：使用
        function(x, y)
            tap(x, y)
            sleep(config.SLEEP_TIME)
        end
    )
    
    if not flag then
        -- 如果没找到"使用"，尝试找"不使用"
        flag = Tools.turing_recognize_and_act(
            675, 648, 815, 688,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
            "0-119",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
            1, 6,                -- 切割参数（来自TURING.切割范围投影切割）
            text_recognition_lib, 
            "不使用",            -- 目标文字：不使用
            function(x, y)
                tap(x, y)
                sleep(config.SLEEP_TIME)
            end
        )
    end
    
    if flag then
        print("点击连续进行右边按钮成功")
        return true
    else
        print("点击连续进行右边按钮失败")
        return false
    end
end

-- 6. 点击包括日程安排
local function ClickIncludeSchedule()
    print("6-点击包括日程安排")
    local flag = Tools.turing_recognize_and_act(
        675, 606, 812, 645,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-60",              -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib, 
        "包括日程安排",       -- 目标文字
        function(x, y)
            tap(x, y)
            sleep(config.SLEEP_TIME)
        end
    )
    
    if flag then
        print("点击包括日程安排成功")
        return true
    else
        print("点击包括日程安排失败")
        return false
    end
end

-- 7. 检测是否确实是"包括日程安排"
local function CheckIncludeSchedule()
    print("7-检测是否确实是包括日程安排")
    local flag = Tools.turing_recognize_and_act(
        675, 648, 815, 688,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-119",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割范围投影切割）
        text_recognition_lib, 
        "包括日程安排",       -- 目标文字
        function(x, y)
            print("确认找到包括日程安排按钮")
            return true
        end
    )
    
    if flag then
        print("确认是包括日程安排按钮")
        return true
    else
        print("不是包括日程安排按钮")
        return false
    end
end


-- 8. 检测并点击一键获得奖励按钮
local function ClickOneKeyRewardButton()
    return Tools.click_button("获得奖励", "获得奖励", "8",
        988, 638, 1088, 678, -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-140",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib -- 字库函数
    )
end

-- 8. 检测并点击一键获得奖励按钮
local function ClickOneKeyRewardAllButton()
    return Tools.click_button("一键获得奖励", "一键获得奖励", "8",
        988, 638, 1088, 678, -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-140",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib -- 字库函数
    )
end



-- 通用滑动查找指定数量文字并点击所有找到的目标
local function ScrollFindAndClickCount(targetText, area, filterParam, cutParam, clickOffsetX, clickOffsetY, requiredCount, successCallback)
    print("开始查找并点击指定数量的文字: " .. targetText .. "，需要找到 " .. requiredCount .. " 个")
    
    -- 使用新的count方法查找指定数量的文字
    local results = Tools.scroll_find_text_count(
        targetText,           -- 目标文字
        area,                 -- 滚动区域坐标
        filterParam,          -- 滤镜参数
        cutParam,             -- 切割参数
        text_recognition_lib_level,  -- 字库函数
        requiredCount         -- 需要找到的数量
    )
    
    if #results >= requiredCount then
        print("成功找到 " .. #results .. " 个目标: " .. targetText)
        
        -- 遍历所有找到的坐标进行点击
        for i, coord in ipairs(results) do
            print("点击第 " .. i .. " 个目标: " .. targetText .. "，坐标 (" .. coord.x .. "," .. coord.y .. ")")
            
            -- 计算点击坐标（支持偏移）
            local clickX = clickOffsetX and (coord.x + clickOffsetX) or coord.x
            local clickY = clickOffsetY and (coord.y + clickOffsetY) or coord.y
            
            -- 执行点击
            tap(coord.x, coord.y)
            sleep(config.SLEEP_TIME)
            tap(clickX, clickY)
            sleep(config.SLEEP_TIME)
        end
        
        -- 如果提供了成功回调函数，则执行
        if successCallback then
            return successCallback(results)
        end
        return true
    else
        print("未找到足够的文字: " .. targetText .. "，只找到 " .. #results .. " 个，需要 " .. requiredCount .. " 个")
        return false
    end
end

-- 通用滑动查找和点击方法（允许找不到目标）
local function ScrollFindAndClickOptional(targetText, area, filterParam, cutParam, clickOffsetX, clickOffsetY, successCallback, notFoundCallback)
    local x, y = Tools.scroll_find_text(
        targetText,           -- 目标文字
        area,                 -- 滚动区域坐标
        filterParam,          -- 滤镜参数
        cutParam,             -- 切割参数
        text_recognition_lib  -- 字库函数
    )
    
    if x and y then
        print("找到目标: " .. targetText .. "，坐标 (" .. x .. "," .. y .. ")")
        -- 点击找到的目标（支持偏移）
        local clickX = clickOffsetX and (x + clickOffsetX) or x
        local clickY = clickOffsetY and (y + clickOffsetY) or y
        tap(clickX, clickY)
        sleep(config.SLEEP_TIME)
        
        -- 如果提供了成功回调函数，则执行
        if successCallback then
            return successCallback(x, y)
        end
        return true
    else
        print("未找到目标: " .. targetText .. "（这是允许的情况）")
        -- 如果提供了未找到回调函数，则执行
        if notFoundCallback then
            return notFoundCallback()
        end
        return true  -- 即使没找到也返回true，表示操作完成
    end
end

-- 10. 在中间区域滑动查找带勾的图案并点击奖励按钮
local function FindAndClickCheckmarkInCenter()
    print("10-在中间区域滑动查找带勾的图案")
    
    -- 中间任务列表区域的坐标（根据界面调整）
    local centerArea = {
        x1 = 229, y1 = 266,  -- 左上角（来自TURING.滤镜_通用_延伸裁剪）
        x2 = 822, y2 = 631   -- 右下角（来自TURING.滤镜_通用_延伸裁剪）
    }
    
    -- 查找第一个带勾的图案
    print("开始查找带勾图案")
    
    -- 使用可选查找方法查找带勾图案（允许找不到）
    local success = ScrollFindAndClickOptional(
        "已完成图标",                    -- 目标文字：勾选
        centerArea,             -- 滚动区域坐标
        "0-91",                 -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        {x = 1, y = 6, width = "15-20", height = "15-20"},  -- 切割参数（来自TURING.切割_范围投影切割）
        nil, nil,               -- 无点击偏移
        function(x, y)          -- 成功回调：点击后检测奖励按钮
            -- 尝试点击一键获得奖励按钮
            if ClickOneKeyRewardAllButton() then
                print("成功点击一键获得奖励按钮")
                sleep(2000)  -- 等待奖励动画
                return true
            else
                -- 如果找不到一键获得奖励按钮，尝试点击获得奖励按钮
                if ClickOneKeyRewardButton() then
                    print("成功点击获得奖励按钮")
                    sleep(2000)  -- 等待奖励动画
                    return true
                else
                    print("未找到任何奖励按钮，可能已经领取完毕，也可能在下一个大区地图里")
                    return false
                end
            end
        end,
        function()              -- 未找到回调：这是允许的情况
            print("未找到带勾图案，可能所有任务都已完成或没有可领取的奖励")
            return false  -- 返回false表示继续进行下次循环查找
        end
    )
    
    if success then
        print("带勾图案查找处理完成")
        return true
    else
        print("带勾图案查找处理失败")
        return false
    end
end

-- 11. 点击指定地区或副本
local function ClickRegionOrInstance(name)
    print("11-点击地区/副本: " .. name)
    
    -- 左侧地区/副本列表区域坐标
    local leftPanelArea = {
        x1 = 13, y1 = 144,   -- 左上角（来自TURING.滤镜_通用_延伸裁剪）
        x2 = 194, y2 = 600   -- 右下角（来自TURING.滤镜_通用_延伸裁剪）
    }
    
    -- 第一步：检测并点击向下的箭头来展开列表
    print("11-1-检测并点击向下的箭头展开列表")
    
    -- 检测地区部分的向下箭头
    local regionArrowFlag = Tools.click_button("打开箭头", "地区向下箭头", "11-1-1",
        13, 144, 180, 600,
        "0-60",             -- 滤镜参数
        1, 30,               -- 切割参数
        text_recognition_lib, -- 字库函数
        "20-22", "14-20"    -- 切割宽度和高度
    )
    
    if regionArrowFlag then
        print("点击地区向下箭头成功")
        sleep(1000)  -- 等待展开动画
    end
    
    -- 检测副本部分的向下箭头
    local instanceArrowFlag = Tools.click_button("打开箭头", "地区向下箭头", "11-1-2",
    13, 144, 180, 600,
    "0-60",             -- 滤镜参数
    1, 30,               -- 切割参数
    text_recognition_lib, -- 字库函数
    "20-22", "14-20"    -- 切割宽度和高度
    )
    
    if instanceArrowFlag then
        print("点击副本向下箭头成功")
        sleep(1000)  -- 等待展开动画
    end
    
    -- 第二步：滑动查找指定的地区或副本
    print("11-2-开始滑动查找地区/副本: " .. name)
    
    -- 使用Tools中的scroll_find_text函数进行滑动查找
    local x, y = Tools.scroll_find_text(
        name,                   -- 目标文字：地区/副本名称
        leftPanelArea,          -- 滚动区域坐标
        "0-60",                 -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        {x = 1, y = 30, width = "30-180", height = "14-20"},  -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib    -- 字库函数
    )
    
    if x and y then
        print("找到地区/副本: " .. name .. "，坐标 (" .. x .. "," .. y .. ")")
        -- 点击找到的地区/副本
        tap(x, y)
        sleep(1000)  -- 等待界面加载
        return true
    else
        print("未找到地区/副本: " .. name)
        return false
    end
end

-- 处理单个区域或副本的奖励领取
local function ProcessLocationRewards(location, locationType)
    print("处理" .. locationType .. ": " .. location.name)
    
    if ClickRegionOrInstance(location.name) then
        print("成功选择" .. locationType .. ": " .. location.name)
        -- 选择位置成功后，在中间区域查找并点击带勾图案
        if FindAndClickCheckmarkInCenter() then
            print("成功处理" .. locationType .. ": " .. location.name)
            return true
        else
            print("处理" .. locationType .. "失败: " .. location.name)
        end
        sleep(2000)  -- 等待处理完成
    else
        print("选择" .. locationType .. "失败: " .. location.name)
    end
    return false

end

-- 点击瞬间移动按钮的辅助函数
local function ClickInstantMoveButton()
    print("尝试点击瞬间移动按钮")
    
    -- 使用Tools.click_button直接点击瞬间移动按钮
    local success = Tools.click_button(
        "瞬间移动",              -- 按钮名称
        "瞬间移动按钮",          -- 按钮描述
        "点击瞬间移动",          -- 操作描述
        1057, 641,              -- 左上角x, y坐标（来自TURING.滤镜_通用_延伸裁剪）
        1212, 683,              -- 右下角x, y坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-91",                 -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                   -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib,   -- 字库函数
        "60-120", "20-25"      -- 切割宽度和高度参数
    )
    
    if success then
        print("成功点击瞬间移动按钮")
        sleep(1000)  -- 等待点击响应
        return true
    else
        print("未找到瞬间移动按钮")
        return false
    end
end

-- 在中间区域滑动查找带已选择图案并点击瞬间移动按钮
local function FindAndClickSelectedPatternInCenter()
    print("在中间区域滑动查找带已选择图案并点击瞬间移动按钮")
    
    -- 中间任务列表区域的坐标（来自TURING.滤镜_通用_延伸裁剪）
    local centerArea = {
        x1 = 229, y1 = 266,  -- 左上角（来自TURING.滤镜_通用_延伸裁剪）
        x2 = 822, y2 = 631   -- 右下角（来自TURING.滤镜_通用_延伸裁剪）
    }
    
    -- 使用while循环持续检测，直到找到任务为止
    local maxAttempts = 10  -- 最大尝试次数，防止无限循环
    local attemptCount = 0
    
    while attemptCount < maxAttempts do
        attemptCount = attemptCount + 1
        print("第 " .. attemptCount .. " 次尝试查找已选择图案")
        
        -- 使用可选查找方法查找已选择图案
        local success = ScrollFindAndClickOptional(
            "已选择图案",                    -- 目标文字：已选择状态
            centerArea,             -- 滚动区域坐标
            "0-91",                 -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
            {x = 1, y = 6, width = "29-32", height = "24-28"},  -- 切割参数（来自TURING.切割_范围投影切割）
            nil, nil,               -- 无点击偏移
            function(x, y)          -- 成功回调：点击后检测瞬间移动按钮
                -- 尝试点击瞬间移动按钮
                if ClickInstantMoveButton() then
                    print("成功点击瞬间移动按钮")
                    sleep(2000)  -- 等待瞬间移动动画
                    return true
                else
                    print("未找到瞬间移动按钮")
                    return false
                end
            end,
            function()              -- 未找到回调：继续尝试
                print("第 " .. attemptCount .. " 次尝试未找到已选择图案，继续尝试...")
                return false  -- 返回false表示继续进行下次循环查找
            end
        )
        
        if success then
            print("已选择图案查找处理完成，在第 " .. attemptCount .. " 次尝试时成功")
            return true
        else
            print("第 " .. attemptCount .. " 次尝试失败，等待后继续...")
            sleep(2000)  -- 等待2秒后继续尝试
        end
    end
    
    print("达到最大尝试次数 " .. maxAttempts .. "，查找已选择图案失败")
    return false
end

-- 处理单个区域或副本的瞬间移动
local function ProcessLocationInstantMove(location, locationType)
    print("处理" .. locationType .. ": " .. location.name .. " 的瞬间移动")
    
    if ClickRegionOrInstance(location.name) then
        print("成功选择" .. locationType .. ": " .. location.name)
        -- 选择位置成功后，在中间区域查找并点击已选择图案，然后点击瞬间移动
        if FindAndClickSelectedPatternInCenter() then
            print("成功处理" .. locationType .. ": " .. location.name .. " 的瞬间移动")
            return true
        else
            print("处理" .. locationType .. "瞬间移动失败: " .. location.name)
        end
        sleep(2000)  -- 等待处理完成
    else
        print("选择" .. locationType .. "失败: " .. location.name)
    end
    return false
end

-- 12. 主领取奖励功能
local function ClaimAllRewards()
    print("12-开始领取所有奖励")
    
    -- 检查配置是否已初始化
    if not gameConfig then
        print("[ERROR] 游戏配置未初始化，无法执行奖励领取")
        return false
    end
    
    -- 遍历所有地区和副本进行奖励领取
    -- 处理区域
    for _, region in ipairs(gameConfig["区域"]) do
        print("处理区域: " .. region.name .. " (子区域数量: " .. #region.areas .. ")")
        -- 无论是否有具体子区域，都要处理大区域
            if ProcessLocationRewards(region, "区域") then
                print("奖励领取完成")
                return true
            end
    end
    
    -- 处理副本
    for _, instance in ipairs(gameConfig["副本"]) do
        print("处理副本: " .. instance.name .. " (子区域数量: " .. #instance.areas .. ")")
        -- 无论是否有具体子区域，都要处理大副本
            if ProcessLocationRewards(instance, "副本") then
                print("奖励领取完成")
                return true
            end
    end
    
    print("所有奖励领取完成")
    return true
end

-- 13. 主开始点击瞬间移动功能
local function StartInstantMoveAllLocations()
    print("13-开始所有地区的瞬间移动")
    
    -- 检查配置是否已初始化
    if not gameConfig then
        print("[ERROR] 游戏配置未初始化，无法执行瞬间移动")
        return false
    end
    
    -- 遍历所有地区和副本进行瞬间移动
    -- 处理区域
    for _, region in ipairs(gameConfig["区域"]) do
        print("处理区域: " .. region.name .. " (子区域数量: " .. #region.areas .. ")")
        -- 无论是否有具体子区域，都要处理大区域
        if ProcessLocationInstantMove(region, "区域") then
            print("瞬间移动完成")
            return true
        end
    end
    
    -- 处理副本
    for _, instance in ipairs(gameConfig["副本"]) do
        print("处理副本: " .. instance.name .. " (子区域数量: " .. #instance.areas .. ")")
        -- 无论是否有具体子区域，都要处理大副本
        if ProcessLocationInstantMove(instance, "副本") then
            print("瞬间移动完成")
            return true
        end
    end
    
    print("所有地区瞬间移动完成")
    return true
end



-- 14. 点击一键接受设置按钮
local function ClickOneKeyAcceptSettings()
    print("14-点击一键接受设置按钮")
            return Tools.click_button("一键接受设置", "一键接受设置", "14",
        64, 604, 171, 635,   -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-108",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib -- 字库函数
    )
end

-- 15. 点击重置设置按钮
local function ClickResetSettings()
    print("15-点击重置设置按钮")
            return Tools.click_button("重置设置", "重置设置", "15",
        34, 561, 130, 634,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-98",              -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib, -- 字库函数
        "60-89", "10-20"     -- 切割宽度和高度参数
    )
end

-- 16. 点击确定重置按钮
local function ClickConfirmReset()
    print("16-点击确定重置按钮")
    local flag = Tools.turing_recognize_and_act(
        418, 223, 859, 409,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-112",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 30,               -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib,
        "是否对设置为一键接受的所有每日任", -- 目标文字
        function(x, y)
            tap(738, 454)    -- 点击确认按钮
            sleep(config.SLEEP_TIME)
        end,
        "377-377", "18-18"   -- 切割宽度和高度参数
    )
    return flag
end

-- 16. 点击保存按钮
local function ClickSave()
    print("16-点击保存按钮")
    return Tools.click_button("保存设置", "保存", "16",
        34, 561, 130, 634,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-98",              -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib, -- 字库函数
        "60-89", "10-20"     -- 切割宽度和高度参数
    )
end

-- 17. 点击一键接受按钮
local function ClickOneKeyAccept()
    print("17-点击一键接受按钮")
    return Tools.click_button("一键接受", "一键接受", "17",
        28, 655, 174, 694,   -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-112",             -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 30,               -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib, -- 字库函数
        "78-78", "18-18"     -- 切割宽度和高度参数
    )
end



-- 18. 在中间区域滑动查找具体区域（支持count配置）
local function FindAndClickSpecificArea(areaConfig)
    local areaName = areaConfig.level or areaConfig.name
    local areaCount = areaConfig.count or 1
    
    print("18-在中间区域滑动查找具体区域 " .. areaName .. "，需要找到 " .. areaCount .. " 个")
    
    -- 中间任务列表区域的坐标（根据界面调整）
    local centerArea = {
        x1 = 219, y1 = 157,  -- 左上角（来自TURING.滤镜_通用_延伸裁剪）
        x2 = 826, y2 = 630   -- 右下角（来自TURING.切割_范围投影切割）
    }
    
    -- 统一使用新的count方法，count为1时也适用
    return ScrollFindAndClickCount(
        areaName,                -- 目标文字：具体区域名称
        centerArea,              -- 滚动区域坐标
        "0-104",                  -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        {x = 1, y = 4, width = "17-60", height = "13-16"},  -- 切割参数（来自TURING.切割_范围投影切割）
        -28, nil,               -- X轴偏移-28，Y轴无偏移
        areaCount,              -- 需要找到的数量
        function(results)       -- 成功回调：等待界面加载
            sleep(1000)  -- 等待界面加载
            return true
        end
    )
end



-- 19. 处理所有区域和副本选择
local function process_all_locations()
    print("开始处理所有区域和副本选择")
    
    -- 遍历所有地区
    for _, region in ipairs(gameConfig["区域"]) do
        if #region.areas > 0 then  -- 只处理有具体区域的地区
            print("处理区域: " .. region.name)
            
            -- 滑动选择左侧大区
            if ClickRegionOrInstance(region.name) then
                -- 遍历该区域下的所有具体区域
                for _, area in ipairs(region.areas) do
                    if area.level then
                        local areaCount = area.count or 1
                        print("处理具体区域: " .. area.level .. "，数量: " .. areaCount)
                        
                        -- 根据等级和数量查找并选择具体区域
                        if FindAndClickSpecificArea(area) then
                            print("成功选择具体区域: " .. area.level .. "，数量: " .. areaCount)
                        else
                            print("选择具体区域失败: " .. area.level .. "，数量: " .. areaCount)
                        return false
                    end
                    
                    -- 区域间稍作等待
                    sleep(500)
                    end
                end
            else
                print("选择大区失败: " .. region.name)
                return false
            end
        end
    end
    
    -- 遍历所有副本
    for _, instance in ipairs(gameConfig["副本"]) do
        if #instance.areas > 0 then  -- 只处理有具体区域的副本
            print("处理副本: " .. instance.name)
            
            -- 滑动选择左侧大区
            if ClickRegionOrInstance(instance.name) then
                -- 遍历该副本下的所有具体区域
                for _, area in ipairs(instance.areas) do
                    if area.level then
                        local areaCount = area.count or 1
                        print("处理具体区域: " .. area.level .. "，数量: " .. areaCount)
                        
                        -- 根据等级和数量查找并选择具体区域
                        if FindAndClickSpecificArea(area) then
                            print("成功选择具体区域: " .. area.level .. "，数量: " .. areaCount)
                        else
                            print("选择具体区域失败: " .. area.level .. "，数量: " .. areaCount)
                        return false
                    end
                    
                    -- 区域间稍作等待
                    sleep(500)
                    end
                end
            else
                print("选择大区失败: " .. instance.name)
                return false
            end
        end
    end
    
    return true
end

-- 20. 一键设置功能
local function OneKeySetup()
    print("20-开始一键设置功能")
    
    -- 第一步：点击一键接受设置
    if ClickOneKeyAcceptSettings() then
        print("点击一键接受设置成功")
        sleep(1000)
        
        -- 第二步：点击重置设置
        if ClickResetSettings() then
            print("点击重置设置成功")
            sleep(1000)
            
            -- 第三步：点击确定重置
            ClickConfirmReset()
            print("点击确定重置完成")
            sleep(1000)
            
            -- 第四步：处理所有区域和副本选择
            if process_all_locations() then
                print("所有区域和副本选择完成")
                if ClickSave() then
                    print("点击保存完成")
                    sleep(1000)
                   
                end
            else
                print("区域和副本选择失败")
                return false
            end
        else
            print("点击重置设置失败")
            return false
        end
    else
        print("点击一键接受设置失败")
        return false
    end
    return false
end



-- 21. 返回主界面
local function ReturnMain()
    print("返回主界面")
    -- 点击返回按钮或关闭按钮
    tap(36, 32)  -- 模拟参数：返回按钮坐标
    sleep(config.SLEEP_TIME)
    return true
end

--确认瞬间移动
local function ClickInstantMove()
    print("点击瞬间移动")
    return Tools.click_button_with_offset("是否要瞬间移动至任务位置", "是否要瞬间移动至任务位置", "31", 
    405, 149, 875, 572,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
    "0-121",               -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
    1,6,                 -- 切割参数（来自TURING.切割范围投影切割）
    text_recognition_lib,
    731-514, 525-211,
    "236-240", "17-21"     -- 切割宽度和高度参数
)
end
-- 导出模块
local M = {}

function M.Test()

    if not init_game_config() then
        print("[ERROR] 游戏配置加载失败，无法执行每日任务")
        return false
    end

   Tools.click_button("已选择图案", "已选择图案", "31", 
    229, 266, 822, 631,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
    "0-91",               -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
    1,6,                 -- 切割参数（来自TURING.切割范围投影切割）
    text_recognition_lib,
    "29-32", "24-28"     -- 切割宽度和高度参数
)
   
 
       
end


---------仅仅开始每日和日程---------------------------------------------------------




-- 4. 主函数：执行每日任务地图配置
function M.StartDailyMission()
    print("开始每日任务基础操作")
    
    -- 在主函数开始时检查一次配置
    if not init_game_config() then
        print("[ERROR] 游戏配置加载失败，无法执行每日任务")
        return false
    end
    
    -- 点击菜单
    if ClickMenuBtn() then
        -- 点击任务
        if ClickTaskBtn() then
            -- 点击每日任务
            if ClickDailyTaskBtn() then
                -- 点击每日任务后的额外操作
                print("开始执行每日任务设置")
                --1 检测并点击连续进行右边的按钮
                if ClickContinuousButton() then
                    -- 点击包括日程安排
                    if ClickIncludeSchedule() then
                    else
                        print("点击包括日程安排失败")
                        return false
                    end
                else
                    print("不用点击已经是包括日程安排")
                end
                -- 2 检测是否确实是"包括日程安排"
                if CheckIncludeSchedule() then
                    print("每日任务设置完成")
                    ClaimAllRewards()  -- 领取奖励
                    if OneKeySetup() then--一键接受设置设置
                        print("一键设置完成")
                        ReturnMain()  -- 返回主界面
                        return true
                    end
                else
                    print("确认包括日程安排失败")
                    return false
                end

            else
                print("点击每日任务失败")
                return false
            end
        else
            print("点击任务失败")
            return false
        end
    else
        print("点击菜单失败")
        return false
    end
end
--开始每日任务以及日程安排
function M.StartDailyAndMisssion()
    print("开始每日任务以及日程安排")
    
    -- 在主函数开始时检查一次配置
    if not init_game_config() then
        print("[ERROR] 游戏配置加载失败，无法执行每日任务和日程安排")
        return false
    end
    
     -- 点击菜单
     if ClickMenuBtn() then
        -- 点击任务
        if ClickTaskBtn() then
            -- 点击每日任务
            if ClickDailyTaskBtn() then
                print("点击每日任务成功")
                --ClaimAllRewards()--领取奖励
                if ClickOneKeyAccept() then
                    print("点击一键接受完成")
                    sleep(1000)
                    if StartInstantMoveAllLocations() then
                        print("点击瞬间移动成功")
                        if ClickInstantMove() then
                            print("点击确认瞬间移动成功")
                        else
                            print("点击确认瞬间移动失败")
                            return false
                        end
                        return true
                    else
                        print("点击瞬间移动失败")
                        return false
                    end  
                end
            else
                print("点击每日任务失败")
                return false
            end
        else
            print("点击任务失败")
            return false
        end
    else
        print("点击菜单失败")
        return false
    end
end

print("dailyMission.lua 每日任务模块已加载")

return M
